package com.sky.controller.admin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sky.dto.DocumentPageQueryDTO;
import com.sky.dto.DocumentUpdateDTO;
import com.sky.dto.DocumentCategoryDTO;
import com.sky.entity.DocumentCategory;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DocumentService;
import com.sky.vo.DocumentVO;
import com.sky.vo.DocumentStatisticsVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/admin/document")
@Api(tags = "文档管理")
@Slf4j
public class DocumentController {

    @Autowired
    private DocumentService documentService;

    /**
     * 分页查询文档列表
     * @param pageQueryDTO 查询参数
     * @return 分页结果
     */
    @GetMapping("/page")
    @ApiOperation("分页查询文档列表")
    public Result<PageResult> pageQuery(DocumentPageQueryDTO pageQueryDTO) {
        log.info("分页查询文档列表: {}", pageQueryDTO);
        Page<DocumentVO> page = documentService.pageQuery(pageQueryDTO);
        PageResult pageResult = new PageResult(page.getTotal(), page.getRecords());
        return Result.success(pageResult);
    }

    /**
     * 获取文档详情
     * @param id 文档ID
     * @return 文档详情
     */
    @GetMapping("/{id}")
    @ApiOperation("获取文档详情")
    public Result<DocumentVO> getById(@PathVariable Integer id) {
        log.info("获取文档详情: {}", id);
        DocumentVO documentVO = documentService.getById(id);
        return Result.success(documentVO);
    }

    /**
     * 上传文档
     * @param file 文件
     * @param title 文档标题
     * @param category 分类ID
     * @param isPublic 是否公开 (private/pending_review/public)
     * @return 文档ID
     */
    @PostMapping("/upload")
    @ApiOperation("上传文档")
    public Result<Integer> upload(@RequestParam("file") MultipartFile file,
                                 @RequestParam("title") String title,
                                 @RequestParam("category") String category,
                                 @RequestParam("isPublic") String isPublic) {
        log.info("上传文档: {}, {}, {}, {}", title, category, isPublic, file.getOriginalFilename());
        Integer documentId = documentService.upload(file, title, category, isPublic);
        return Result.success(documentId);
    }

    /**
     * 更新文档
     * @param documentUpdateDTO 更新参数
     * @return 操作结果
     */
    @PutMapping
    @ApiOperation("更新文档")
    public Result update(@RequestBody DocumentUpdateDTO documentUpdateDTO) {
        log.info("更新文档: {}", documentUpdateDTO);
        documentService.update(documentUpdateDTO);
        return Result.success();
    }

    /**
     * 删除文档
     * @param id 文档ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除文档")
    public Result delete(@PathVariable Integer id) {
        log.info("删除文档: {}", id);
        documentService.delete(id);
        return Result.success();
    }

    /**
     * 切换文档状态
     * @param id 文档ID
     * @param params 包含status的请求体参数
     * @return 操作结果
     */
    @PutMapping("/status/{id}")
    @ApiOperation("切换文档状态")
    public Result toggleStatus(@PathVariable Integer id, @RequestBody java.util.Map<String, String> params) {
        String status = params.get("status");
        log.info("切换文档状态: {}, {}", id, status);
        documentService.toggleStatus(id, status);
        return Result.success();
    }

    /**
     * 切换文档公开状态
     * @param id 文档ID
     * @param params 包含isPublic的请求体参数
     * @return 操作结果
     */
    @PutMapping("/public/{id}")
    @ApiOperation("切换文档公开状态")
    public Result togglePublic(@PathVariable Integer id, @RequestBody java.util.Map<String, String> params) {
        String isPublic = params.get("isPublic");
        log.info("切换文档公开状态: {}, {}", id, isPublic);
        documentService.togglePublic(id, isPublic);
        return Result.success();
    }
    
    /**
     * 文档审核
     * @param id 文档ID
     * @param action 审核动作 (approve/reject)
     * @return 操作结果
     */
    @PostMapping("/review/{action}/{id}")
    @ApiOperation("文档审核")
    public Result reviewDocument(@PathVariable Integer id, @PathVariable String action) {
        log.info("文档审核: {}, {}", id, action);
        documentService.reviewDocument(id, action);
        return Result.success();
    }

    /**
     * 下载文档
     * @param id 文档ID
     * @param response 响应对象
     */
    @GetMapping("/download/{id}")
    @ApiOperation("下载文档")
    public void download(@PathVariable Integer id, HttpServletResponse response) throws IOException {
        log.info("下载文档: {}", id);
        documentService.download(id, response);
    }

    /**
     * 预览文档
     * @param id 文档ID
     * @param response 响应对象
     */
    @GetMapping("/preview/{id}")
    @ApiOperation("预览文档")
    public void preview(@PathVariable Integer id, HttpServletResponse response) throws IOException {
        log.info("预览文档: {}", id);
        documentService.preview(id, response);
    }



    /**
     * 获取文档分类列表
     * @return 分类列表
     */
    @GetMapping("/category/list")
    @ApiOperation("获取文档分类列表")
    public Result<List<DocumentCategory>> getCategoryList() {
        log.info("获取文档分类列表");
        List<DocumentCategory> categoryList = documentService.getCategoryList();
        return Result.success(categoryList);
    }

    /**
     * 新增文档分类
     * @param categoryDTO 分类信息
     * @return 分类ID
     */
    @PostMapping("/category")
    @ApiOperation("新增文档分类")
    public Result<Integer> addCategory(@RequestBody DocumentCategoryDTO categoryDTO) {
        log.info("新增文档分类: {}", categoryDTO);
        Integer categoryId = documentService.addCategory(categoryDTO);
        return Result.success(categoryId);
    }

    /**
     * 更新文档分类
     * @param id 分类ID
     * @param categoryDTO 分类信息
     * @return 操作结果
     */
    @PutMapping("/category/{id}")
    @ApiOperation("更新文档分类")
    public Result updateCategory(@PathVariable Integer id, @RequestBody DocumentCategoryDTO categoryDTO) {
        log.info("更新文档分类: {}, {}", id, categoryDTO);
        documentService.updateCategory(id, categoryDTO);
        return Result.success();
    }

    /**
     * 删除文档分类
     * @param id 分类ID
     * @return 操作结果
     */
    @DeleteMapping("/category/{id}")
    @ApiOperation("删除文档分类")
    public Result deleteCategory(@PathVariable Integer id) {
        log.info("删除文档分类: {}", id);
        documentService.deleteCategory(id);
        return Result.success();
    }

    /**
     * 获取文档统计信息
     * @return 统计信息
     */
    @GetMapping("/statistics")
    @ApiOperation("获取文档统计信息")
    public Result<DocumentStatisticsVO> getStatistics() {
        log.info("获取文档统计信息");
        DocumentStatisticsVO statistics = documentService.getStatistics();
        return Result.success(statistics);
    }
}